package com.tegtech.core.filter;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.tegtech.common.constant.CacheExpire;
import com.tegtech.common.constant.CacheKey;
import com.tegtech.common.utils.date.DateUtils;
import com.tegtech.starter.redis.service.RedisCacheHelper;

import cn.hutool.core.convert.Convert;
import cn.hutool.crypto.digest.MD5;
import lombok.Getter;


/**
 * 签名校验辅助类
 * @Author Jun
 * @date 2021年3月4日 下午5:06:04
 */
@Component
public class SignatureHelper {
	
	@Getter
	private static String secret;
	
	@Value("${sign.secret}")
	public void setSecret(String secret) {
		SignatureHelper.secret = secret;
	}
	
	
	/**
	 * 生成签名
	 * @param requestToken
	 * @param requestUri
	 * @param requestTime
	 * @param requestId
	 * @return
	 */
	public static String createSignature(String requestUri, String requestToken, String requestTime, String requestId) {
		StringBuffer sb = new StringBuffer(requestUri).append(requestToken).append(requestTime).append(requestId).append(getSecret());
		return MD5.create().digestHex(sb.toString()).toUpperCase();
	}
	
	/**
	 * 校验请求是否已过期，请求超过10分钟则过期
	 * @param requestTime
	 * @return true 已过期； false 未过期
	 */
	public static boolean checkRequestTime(String requestTime) {
		return (DateUtils.unix() - Convert.toLong(requestTime, 0L)) > 600;
	}
	
	/**
	 * 校验请求是否重复
	 * @param requestId
	 * @return true 重复请求； false 未重复
	 */
	public static boolean checkRequestId(String requestId) {
		return RedisCacheHelper.instance.hasKey(CacheKey.REQUEST_ID + requestId);
	}
	
	/**
	 * 缓存requestId
	 * @param requestId
	 */
	public static void cacheRequestId(String requestId) {
		RedisCacheHelper.instance.set(CacheKey.REQUEST_ID + requestId, null, CacheExpire.TEN_MINUTES);
	}
	
}
